/**
 * @author:fangxiaohua
*  @邮箱：abc2710712@qq.com
*  @qq:1295168875
*  node express
*/
void(function(exports){
	//导入zTool模块
	var zTool = require("./routes/lib/zTool");  
	//导入chatLib模块,并实例化
	var chatLib = require("./routes/lib/chatLib");
	//chat常量
	var chatConfig = require('./routes/lib/contantsLib').CHAT_CONFIG;//web服务配置常量
	var EVENT_TYPE=chatConfig.event_type;
	
	
	//服务端聊天数据暂存
	//房间1信息
	var r1_onlineUserMap = new zTool.SimpleMap(); 
	var r1_historyContent = new zTool.CircleList(100);
	//房间2信息
	var r2_onlineUserMap = new zTool.SimpleMap(); 
	var r2_historyContent = new zTool.CircleList(100);
	//房间3信息
	var r3_onlineUserMap = new zTool.SimpleMap(); 
	var r3_historyContent = new zTool.CircleList(100);
	//房间4信息
	var r4_onlineUserMap = new zTool.SimpleMap(); 
	var r4_historyContent = new zTool.CircleList(100);
	
	
	//导入socket.io模块,并监听制定服务端口
	var io =  require('socket.io').listen(chatConfig.port);
	
	//监听该通道连接事件
	io.sockets.on('connection',function(socket){
  
		    console.log("socket链接=====有人上线=======");
			io.sockets.emit('update_userno',{no1:r1_onlineUserMap.size(),no2:r2_onlineUserMap.size(),no3:r3_onlineUserMap.size(),no4:r4_onlineUserMap.size()});
		//服务起监听所有用户的message消息
		socket.on("message",function(message){
			//消息序列化为json对象
	        var mData =JSON.parse(message);
	        
	        if (mData && mData.roomTab&&mData.event) {
	        	//判断动作类型
				switch (mData.event) {
				case EVENT_TYPE.LOGIN: // 新用户连接
					//新用户信息
					var newUser = {'uid':socket.id, 'user':mData.user,"time":mData.time};
					 var resData=null;
					//根据选择的房间不同,设置不同的用户列表
					switch(mData.roomTab){
						case "room-one" :
								r1_onlineUserMap.put(socket.id, newUser);
								//将新登录用户信息序列化成json数据
								resData= JSON.stringify({
						                'event' : EVENT_TYPE.LOGIN,
						                'roomTab':mData.roomTab,
						                'nUser' : socket.id,
						                'users':r1_onlineUserMap.values(),
						                'historyContent':r1_historyContent.values()
						           });
								break;
						case "room-two" :
								r2_onlineUserMap.put(socket.id, newUser);
								resData= JSON.stringify({
					                'event' : EVENT_TYPE.LOGIN,
					                'roomTab':mData.roomTab,
					                'nUser' : socket.id,
					                'users':r2_onlineUserMap.values(),
					                'historyContent':r2_historyContent.values()
					           });
							break;
						case "room-three" :
								r3_onlineUserMap.put(socket.id, newUser);
								resData= JSON.stringify({
					                'event' : EVENT_TYPE.LOGIN,
					                'roomTab':mData.roomTab,
					                'nUser' : socket.id,
					                'users':r3_onlineUserMap.values(),
					                'historyContent':r3_historyContent.values()
					           });
								break;
						case "room-four":
								r4_onlineUserMap.put(socket.id, newUser);
								resData= JSON.stringify({
					                'event' : EVENT_TYPE.LOGIN,
					                'roomTab':mData.roomTab,
					                'nUser' : socket.id,
					                'users':r3_onlineUserMap.values(),
					                'historyContent':r3_historyContent.values()
					           });
								break;
					}
					console.log("=====加入房间======");
					console.log(resData);
					console.log("===================");
					//用户进入指定的room,更新房间人数
					io.sockets.emit('update_userno',{no1:r1_onlineUserMap.size(),no2:r2_onlineUserMap.size(),no3:r3_onlineUserMap.size(),no4:r4_onlineUserMap.size()});
	                // 把新用户的信息广播给在线用户
	                io.sockets.emit('message',resData);//广播,即促发message事件
	                //socket.emit('message',data);
	                // socket.broadcast.emit('message', data);//无效
					break;
					
					
					
					
					
				case EVENT_TYPE.SPEAK: // 用户发言
					//发言内容不为空判断
					var content = chatLib.getMsgFirstDataValue(mData);
					//序列化发言数据
	                var data = JSON.stringify({
	                    'user':onlineUserMap.get(socket.id),
	                    'EVENT' : EVENT_TYPE.SPEAK,
	                    'values' : [content]
	                });
	                //socket.emit('message',data);
	                io.sockets.emit('message',data);
					historyContent.add({'user':onlineUserMap.get(socket.id),'content':content,'time':new Date().getTime()});
					break;
				
					
					
					
					
					
	            case EVENT_TYPE.LOGOUT: // 用户请求退出
	                var uid = mData.uid;
	        		//根据选择的房间不同,设置不同的用户列表
					switch(mData.roomTab){
						case "room-one" :
								r1_onlineUserMap.remove(uid);
								break;
						case "room-two" :
								r2_onlineUserMap.remove(uid);
							break;
						case "room-three" :
								r3_onlineUserMap.remove(uid);
								break;
						case "room-four":
								r4_onlineUserMap.remove(uid);
								break;
					}
					resData= JSON.stringify({
		                'event' : EVENT_TYPE.LOGOUT,
		                'uid' : uid,
		                "roomTab":mData.roomTab
		           });
					console.log("=====离开房间======");
					console.log(resData);
					console.log("==================");
	                 //广播,即促发message事件
	                io.sockets.emit('message',resData);
				}
			} else {
				// 事件类型出错，记录日志，向当前用户发送错误信息
				console.log('desc:message,userId:' + socket.id + ',message:' + message);
	            var data = JSON.stringify({
	                'uid':socket.id,
	                'EVENT' : EVENT_TYPE.ERROR
	            });
	            socket.emit('message',data);
			}
	   });

	});

	console.log('chat服务启动,正在监听端口: ' + chatConfig.port);
})( (function(){
    if(typeof exports === 'undefined') {
        window.exports = {};
        return window.exports;
    } else {
        return exports;
    }
})());






